Skip to content

Conversation

@Uralauah
Copy link
Contributor

👤게스트 로그인 구현

📝 개요

게스트 로그인을 구현하였습니다.


⚙️ 구현 내용

Redis에 게스트 정보를 저장하기 위한 GuestUser 클래스를 생성했습니다.
게스트의 id는 중복되면 안되기 때문에 중복인지 아닌지 검사를 통해 생성하였고, 최대한 중복이 되지 않게 하기 위해서 64비트 값을 반환하는 함수인 UUID.randomUUID().getMostSignificantBits()를 사용해서 생성하였습니다.
닉네임은 무작위 형용사와 명사를 사용해서 6글자 이내로 생성하도록 하였습니다.

게스트의 정보가 만들어지면 레디스에 저장 후, 해당 정보를 토대로 토큰을 생성합니다.

게스트는 일반 사용자와 다르게 할 수 있는 기능에 제한을 둘 예정이라 일반 유저의 SecurityUserDetails와 달리 GuestUserDetails를 생성해서 게스트 전용 인증 객체를 사용하였습니다.

JwtAuthenticationFilter에서 토큰을 검사하는 과정에서 아래와 같은 로직을 통해 권한이 게스트라면 게스트 객체를 통해 게스트 권한만 주도록 했습니다.

String accessToken = resolveAccessToken(response, accessTokenHeader);

String role = tokenProvider.getRole(accessToken);
UserDetails userDetails;

if (String.valueOf(Role.GUEST).equals(role)) {
    Long guestId = tokenProvider.getUserId(accessToken);
    GuestUser guestUser = guestUserService.getGuestUser(guestId);
    userDetails = new GuestUserDetails(guestUser);
} else {
    String username = tokenProvider.getUsername(accessToken);
    userDetails = userDetailsService.loadUserByUsername(username);
}

그리고 현재 로그인 시 at, rt를 같이 발행해주기 때문에 at가 만료되면 일반 사용자와 같이 재발급을 하면 똑같이 재발급이 되게 됩니다.
게스트가 로그인되어 있는 동안은 게스트의 정보가 redis에 유지되어야 하기 때문에 권한 인증 과정에서 guestUserService.getGuestUser(guestId); 메서드를 호출할 때마다 ttl을 초기화해주도록 하였습니다.


📎 기타

게스트와 일반 사용자가 같은 기능을 사용하게 된다면 역할을 분리해주기 위해서 아래와 같이 사용하면 될 것 같습니다.
사용자의 정보를 조회하는 간단한 예시입니다.

    @GetMapping("/info")
    public Object info(@AuthenticationPrincipal UserDetails userDetails) {

        if(userDetails instanceof GuestUserDetails)
            return GuestUser.builder()
                .guestId(((GuestUserDetails) userDetails).getGuestId())
                .guestNickname(userDetails.getUsername())
                .build();
        else if(userDetails instanceof SecurityUserDetails)
            return User.builder()
                .userId(((SecurityUserDetails) userDetails).getUserId())
                .email(userDetails.getUsername())
                .build();

🧪 테스트 결과

게스트 사용자 정보 조회 결과
image


@Uralauah Uralauah requested review from brothergiven and jung-min-ju and removed request for brothergiven March 26, 2025 13:35
@Uralauah Uralauah closed this Apr 9, 2025
@Uralauah Uralauah deleted the feat/auth branch April 10, 2025 02:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants